package algo3c3g3.view;

import javax.swing.*;
import java.awt.*;
import algo3c3g3.model.*;
import algo3c3g3.controller.*;


/**
 * Ventana principal del juego. Contiene a los demas elemetos de la vista.
 */
public class MainWindow extends JFrame implements View
{
    private GameArea gameArea;
    private ActionPanel actionPanel;
    private StatusPanel status;
    
    private Level level;
    private Controller controller;
    
    
    public MainWindow()
    {
        level = null;
        controller = null;
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        resetScreen();
        
        setJMenuBar(new GameMenus(this).getMenuBar());
        
        setTitle("Pooglins");
        
        setBounds(0, 0, 800, 600);
        setVisible(true);
    }
    
    
    /**
     * Elimina todos los elementos de la vista del juego.
     */
    public void resetScreen()
    {
        JPanel panel = (JPanel) getContentPane();
        panel.removeAll();
        panel.setLayout(new FlowLayout());
        panel.add(new Label("POOGLINS"));
        setBounds(0, 0, 800, 600);
        repaint();
    }
    
    
    /**
     * Crea todos los elementos de la vista del juego.
     */
    public void initScreen()
    {
        JPanel panel = (JPanel) getContentPane();
        panel.removeAll();
        
        gameArea = new GameArea(level, controller);
        actionPanel = new ActionPanel(level, controller);
        status = new StatusPanel(level);
        
        panel.setLayout(new GridBagLayout());
        
        GridBagConstraints c = new GridBagConstraints();
        
        c.gridy = 0;
        panel.add(gameArea, c);
        
        c.gridy = 1;
        c.fill = GridBagConstraints.HORIZONTAL;
        panel.add(status, c);
        
        c.gridy = 2;
        c.fill = GridBagConstraints.HORIZONTAL;
        panel.add(actionPanel, c);
        
        pack();
    }
    
    public void showInfoMsessage(String msg, String title)
    {
        JOptionPane.showMessageDialog(this, msg, title, JOptionPane.INFORMATION_MESSAGE);
    }
    
    public void showErrorMessage(String msg)
    {
        JOptionPane.showMessageDialog(this, msg, "Error", JOptionPane.ERROR_MESSAGE);
    }
    
    /**
     * Indica a la vista cual es el modelo de datos que va a representar.
     */
    public void setLevel(Level level)
    {
        this.level = level;
    }
    
    /**
     * Devuelve la referencia al modelo de datos asociado.
     */
    public Level getLevel()
    {
        return level;
    }
    
    /**
     * Registra el controlador que maneja el modelo de datos asociado
     * a esta vista.
     */
    public void registerController(Controller controller)
    {
        this.controller = controller;
    }
    
    /**
     * Actualiza el tiempo del juego.
     */
    public void updateTime()
    {
        status.updateTime();
    }
}
